public class Lobby {
	
	/**
	 * Atributos
	 */
	private Ventanilla[] ventanillas;
	private ListaEventos orden;
	private int promedio;
	
	/**
	 * Construcción de la clase
	 */
	public Lobby()
	{
		//Crea las 4 ventanillas del banco
		//Inicializa las 4 ventanilas
		//Inicializa la lista de eventos
		//Inicializa el promedio que tardan los clientes
		ventanillas=new Ventanilla[4];
		ventanillas[0]= new Ventanilla();
		ventanillas[1]= new Ventanilla();
		ventanillas[2]= new Ventanilla();
		ventanillas[3]= new Ventanilla();
		orden=new ListaEventos();
		promedio=0;
		
	}
	
	/**
	 * Método que agrega un cliente a la lista de eventos
	 * @param cliente
	 */
	public void entraCliente(Cliente cliente)
	{
		Evento evento =new Evento(cliente.getT1(), cliente);
		orden.add(evento);
	}
	
	/**
	 * Método para atender la lista de eventos
	 */
	public void atiende()
	{
		int tiempo=0;
		int numclien=0;
		int i=0;
		Evento evento,extra;
		int lin=-1;
		Cliente extracl,eventocl;
		int la0=ventanillas[0].getLargo();
		int la1=ventanillas[1].getLargo();
		int la2=ventanillas[2].getLargo();
		int la3=ventanillas[3].getLargo();
		
		//Termina hasta que la lista de eventos este vacía
		while(orden.getCant()>0)
		{
			//Obtiene el evento en la posición i
			evento=orden.getEvento(i);
			//revisa si es un evento de entrada o salida
			if(evento.getTipo()==0)
			{
				la0=ventanillas[0].getLargo();
				la1=ventanillas[1].getLargo();
				la2=ventanillas[2].getLargo();
				la3=ventanillas[3].getLargo();
				lin=-1;
				
				//Revisa que ventanilla tiene menos clientes y/o está vacía
				//Si no hay ninguna vacía pasa al siguiente evento
				if((la0<=la1)&&(la0<=la2)&&(la0<=la3))
					lin=0;
				else if((la1<=la0)&&(la1<=la2)&&(la1<=la3))
					lin=1;
				else if((la2<=la1)&&(la2<=la0)&&(la2<=la3))
					lin=2;
				else if((la3<=la1)&&(la3<=la2)&&(la3<=la0))
					lin=3;
				else
					i++;
				
				//Si pudo hay espacio en la cola...
				if(lin!=-1)
				{
					//Indica a que ventanilla pertenece el evento y obtiene el cliente del evento
					evento.setVent(lin);
					eventocl=evento.getCliente();
					
					//Le suma el tiempo de todos los clientes que pasaron antes que el
					//cliente actual y que estuvieron en la misma ventanilla
					for(int j=(i+1);j<orden.getCant();j++)
					{	extra=orden.getEvento(j);
						extracl=extra.getCliente();
						if(extra.getTipo()==1)
							if(extra.getVent()==lin)
								eventocl.setTotal(extracl.getTotal()+eventocl.getTotal());
					}
					
					//Ingresa al cliente en la ventanilla correspondiente
					//Elimina el evento actual de la lista y crea uno de salida
					//Vuelve a recorrer la lista desde 0
					evento.setCliente(eventocl);
					ventanillas[lin].entraCliente(evento.getCliente());
					evento=new Evento(eventocl.getTotal()+eventocl.getT2(),eventocl);
					evento.setTipo(1);
					orden.remove(i);
					orden.add(evento);
					i=0;
				}
			//Si no era un evento de entrada...
			}else
			{
				//Quita al cliente de la ventanilla indicada por el evento actual
				//Calcula el tiempo y quita el evento de la lista de eventos
				//Aumenta la cantidad de clientes y vuelve a recorrer la lista de
				//eventos desde 0
				eventocl=ventanillas[evento.getVent()].saleCliente();
				tiempo=tiempo+eventocl.getTotal()+eventocl.getT2();
				orden.remove(i);
				numclien++;
				i=0;
			}
		}
		
		//Calcula el promedio de tiempo de todos los clientes
		promedio=tiempo/numclien;
		
	}
	
	/**
	 * Método que devuelve el promedio de tiempo que tardaron los clientes
	 * @return
	 */
	public int getPromedio()
	{
		return this.promedio;
	}
	

}
